const { User } = require('../models')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')

// 加密密码的盐值轮数
const SALT_ROUNDS = 10
// JWT密钥（应从环境变量中读取）
const JWT_SECRET = process.env.JWT_SECRET || 'smart-traffic-secret'

class UserService {
  /**
   * 创建新用户（注册）
   * @param {Object} userData 用户数据
   * @returns {Promise<Object>} 创建的用户对象
   */
  async createUser(userData) {
    try {
      // 检查账号是否已存在
      const existingUser = await User.findOne({
        where: { account: userData.account },
      })
      if (existingUser) {
        throw new Error('账号已存在')
      }
      //检查密码是否有6位
      if (userData.password.length < 6) {
        throw new Error('密码长度不能小于6位')
      }
      // 检查两次密码是否一致
      if (userData.password !== userData.repassword) {
        throw new Error('两次密码不一致')
      }
      // 对密码进行加密
      const hashedPassword = await bcrypt.hash(userData.password, SALT_ROUNDS)
      // 创建新用户（普通用户只能注册为普通用户）
      const newUser = await User.create({
        ...userData,
        password: hashedPassword,
        role: 'normal', // 只能是普通用户
      })
      // 不返回密码
      const { password, ...userWithoutPassword } = newUser.toJSON()
      return userWithoutPassword
    } catch (error) {
      throw error
    }
  }

  /**
   * 用户登录
   * @param {string} account 账号
   * @param {string} password 密码
   * @returns {Promise<Object>} 用户信息和token
   */
  async login(account, password) {
    try {
      // 查找用户
      const user = await User.findOne({ where: { account } })
      if (!user) {
        throw new Error('账号不存在')
      }
      // 验证密码
      const isPasswordValid = await bcrypt.compare(password, user.password)
      if (!isPasswordValid) {
        throw new Error('密码错误')
      }
      // 生成JWT令牌
      const token = jwt.sign(
        {
          id: user.id,
          account: user.account,
          role: user.role,
        },
        JWT_SECRET,
        { expiresIn: '24h' }
      )
      // 不返回密码(约定俗成的表示:_表示忽略)
      const { password: _, ...userWithoutPassword } = user.toJSON()
      return {
        user: userWithoutPassword,
        token,
      }
    } catch (error) {
      throw error
    }
  }

  /**
   * 根据ID获取用户
   * @param {number} userId 用户ID
   * @returns {Promise<Object>} 用户对象
   */
  async getUserById(userId) {
    try {
      const user = await User.findByPk(userId)
      if (!user) {
        throw new Error('用户不存在')
      }

      const { password, ...userWithoutPassword } = user.toJSON()
      return userWithoutPassword
    } catch (error) {
      throw error
    }
  }
}

module.exports = new UserService()
